package org.lora.core.common;

import java.lang.annotation.Annotation;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionManager;
import org.apache.log4j.Logger;
import org.lora.core.context.WebContext;
import org.lora.log4j.Log4jUtil;

/**
 * <p>
 * Title:CommonCoreServiceImpl
 * </p>
 * Desription:所有核心Service的基类<br>
 * Create Time:2016年7月14日 下午3:49:45<br>
 * 
 * @author Bladnir@outlook.com<br>
 *         History:<br>
 *         2016年07月14日 Bladnir Create<br>
 *         2016年08月29日 Bladnir getService可以获得mapper<br>
 *         2016年11月16日 Bladnir 修改sqlSession的创建方式<br> 
 *         之前的创建方式是线程不安全的，高并发下会造成连接释放问题<br>
 */
public class CommonCoreServiceImpl {

	protected Logger systemLog = Log4jUtil.getSystemLogger();

	/**
	 * 从WebContext中获取包装好的Service
	 * 
	 * @param interfaceClass
	 * @return
	 */
	protected <T> T getService(Class<T> interfaceClass) {

		if (interfaceClass == null) {
			return null;
		}

		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(interfaceClass);

		if (sqlSessionFactory != null) {// 说明这是一个DAO
			SqlSession sqlSession = null;
			try {

				/********************************************************
				 * 2016年11月16日 Bladnir 修改sqlSession的创建方式
				 * 之前的创建方式是线程不安全的，高并发下会造成连接释放问题 sqlSession =
				 * sqlSessionFactory.openSession();
				 * 
				 * **************************************************************/

				sqlSession = SqlSessionManager.newInstance(sqlSessionFactory).openSession();

				return sqlSession.getMapper(interfaceClass);
			} catch (Exception e) {
				systemLog.error(e.getMessage(), e);
			} finally {
				if (sqlSession != null) {
					sqlSession.close();
				}
			}

		} else {// 目前认为这就是一个Service 目前没有办法去装配一个action
			Map<String, Object> serviceBeanMap = WebContext.getInstance().getServiceBeanMap();

			if (serviceBeanMap.containsKey(interfaceClass.getName())) {
				Object obj = serviceBeanMap.get(interfaceClass.getName());
				return interfaceClass.cast(obj);
			}
		}

		return null;

	}

	/**
	 * 获取这个DAO 对应的数据源的SqlSessionFactory
	 * 
	 * @param clz
	 * @return
	 */
	private SqlSessionFactory getSqlSessionFactory(Class<?> clz) {

		Map<String, SqlSessionFactory> sqlSessionFactoryMap = WebContext.getInstance().getSqlSessionFactoryMap();

		Annotation[] annotationArray = clz.getAnnotations();

		for (Annotation entry : annotationArray) {

			String annotationClassName = entry.annotationType().getName();

			if (sqlSessionFactoryMap.containsKey(annotationClassName)) {
				return sqlSessionFactoryMap.get(annotationClassName);
			}
		}

		return null;
	}
}
